/******************************************************************************
* 文件 :
* 描述 :
* 备注 :
******************************************************************************/


//===============================================
INT8U OSIntNest;            //中断嵌套
INT8U OSSchedLock;          //调度锁
INT8U OSRunStart;
#if OS_CFG_RR_EN > 0
INT8U OSRRSlice;       //时间片
#endif

OS_TASK_OBJ *OSTaskNew;     //待运行
OS_TASK_OBJ *OSTaskRun;     //当前任务

OS_LIST OSReadyList[OS_CFG_PRIO_MAX];   //就绪表
INT32U OSReadyBit;          //位图
INT8U OSPrioTop;            //最高优先级

OS_LIST OSTickHead[OS_TICK_HEAD_NUM]; //延时表
OS_TICK_TM OSTickCount;

OS_TASK_OBJ OSIdleObj;      //空闲任务
CPU_STK OSIdleStk[OS_IDLE_STK_SZ];

//===============================================
#if OS_CFG_TIMER_EN > 0
OS_LIST OSTimerHead[1];

OS_TASK_OBJ OSTimerObj;     //计时器任务
CPU_STK OSTimerStack[OS_TIMER_STK_SZ];

#endif

//===============================================

extern CPU_DATA OS_CPU_Lock(void);
extern void OS_CPU_Restore(CPU_DATA x);

//临界段
#define OS_ATOM_ARG()           CPU_DATA os_atom
#define OS_ATOM_LOCK()          { os_atom = OS_CPU_Lock();}
#define OS_ATOM_UNLOCK()        { OS_CPU_Restore(os_atom);}


/******************************************************************************
* 功能:
* 参数:
* 返回:
* 注意: 哨兵
******************************************************************************/
void Os_TaskExit(void)
{
    OS_CPU_Lock();
    for(;;);
}

/******************************************************************************
* 功能:
* 参数:
* 返回:
* 注意: 自动 + 手动
     8:                             psr pc LR R12 R3~R0
 FPU 26(18+8): FPCAR FPSCR s15~s0 /
******************************************************************************/
void *OS_TaskStkInit(OS_TASK_FUN fun,void *arg,CPU_STK *top)
{
	CPU_STK *sp = (CPU_STK *)(((CPU_STK)top)&0xfffffff8); //栈 8字节对齐

    //自动 满栈减
	sp[-1] = (CPU_STK)0x01000000;   //PSR
	sp[-2] = (CPU_STK)fun;          //R15
	sp[-3] = (CPU_STK)Os_TaskExit;  //R14
	sp[-8] = (CPU_STK)arg;          //R12,R3-R0

    //手动 16:S31-S16    8:R11-R4
	return(sp-(8+16+8));
}


